Computing hardware frequently does not distinguish between bits (ones and zeroes) on the basis of what those bits are intended to mean to people. In a computing system, it often happens that when character strings, integer values, lists, tables, hierarchies, pieces of data structures, code sequences, and other data are moved about or otherwise manipulated, those manipulations are each accomplished using the same basic low-level hardware regardless of the data's intended meaning. Even the distinction between bits that are meant to be executed by a processor and bits that are not, is a distinction created by people and people's tools. The meaning of bits, and the actual impact of bit movements and bit manipulations, all depend ultimately on human interpretation. It is developers and other people who assign the ultimate meanings of bits in smartphones, tablets, laptops, networks, and other systems.
One way developers assign meaning to bits is to define software content and behavior using programming languages. One aspect of programming languages which helps document and implement particular meanings in software is known generally as “typing”. Typing is also referred to using the phrases “type system” and “data types”, among others. By associating data types with at least some of the variables, constants, routines, interfaces, and other constructs or artifacts in a program, software developers add meaning to the underlying bits. Without added meaning, program bits are merely sequences of ones and zeroes.